package com.iatinspur.learn;

import com.iatinspur.My;

import java.io.*;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;

/**
 * 15集  讲解 【打破】双亲委派机制
 *       线程上下文类加载器
 *
 *  todo 为啥要打破
 *       一个AppClassLoader 要加载了两个名称相同的类 加载了一个可能另外一个就不能加载了，自定义两个个类加载器，当加载这个类时 我们就不要让AppClassLoader去加载
 *
 *  todo 打破双亲委派机制的三个方法
 *       1.自定义类加载器
 *       2.线程上下文类加载器   演示
 *       3.Osgi框架的类加载器
 *
 *
 *  线程上下文类加载器 使用的是jdbc jndi等
 */
public class Learn_12_JVM {
    public static void main(String[] args) {
        Thread.currentThread().setContextClassLoader(new Learn_12_JVM_ClassLoader());
        System.out.println(Thread.currentThread().getContextClassLoader());

    }

}


class Learn_12_JVM_ClassLoader extends ClassLoader{
    public static  Map<String,Class<?>> map=new HashMap<String,Class<?>>();


    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        if (name.startsWith("java.lang")) {
            return super.loadClass(name);
        }

        if (name.startsWith("java.io")) {
            return super.loadClass(name);
        }
        if (name.startsWith("com.iatinspur.My")) {
            return super.loadClass(name);
        }

        Class<?> loadedClass = findClass(name);
        if (loadedClass != null) {
            System.err.println("不空");
            return loadedClass;
        }
        InputStream in = null;
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        try {
            in = new FileInputStream(new File("D:\\myClass\\MyIml.class"));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        byte[] buf = new byte[1024];
        int temp;
        try {
            while((temp=in.read(buf))!=-1){
                bo.write(buf, 0, temp);
            }
        }catch (IOException e){

        }
        System.out.println(bo.toByteArray().length);
        Class<?> aClass = defineClass(name, bo.toByteArray(), 0, bo.toByteArray().length);
        map.put(name, aClass);
        return aClass;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        return map.get(name);
    }
}





